package com.spring.dive.a03method;

import java.util.List;
import java.util.Random;

/**
 * 定义泛型方法
 */
public class GenericMethod<T> {

    private T t;
    public GenericMethod(T t) {
        this.t = t;
        System.out.println("------>t:"+t);
    }

    // 1.定义泛型方法,可以有多个泛型
    public <E> void printMethod(T t,E e) {
        System.out.println("------>t:"+t+" e:"+e);
    }
    // 2.类型由调用的时候决定，泛型标识不必和类的泛型保持一致
    public <E> E printMethodList(List<E> list) {
        return list.get(new Random().nextInt(list.size()));
    }
    // 3.泛型方法可以独立于泛型类，可以在普通类中存在
    public <E> E printMethodList2(List<E> list) {
        return list.get(new Random().nextInt(list.size()));
    }
    // 4.泛型方法可以为static
    public static <T> T printMethodList3(List<T> list) {
        return list.get(new Random().nextInt(list.size()));
    }
    // 5.没有在public和返回值之间添加<T>的【不能算】作【泛型方法】当前方法不能为static
    public T print() {
        return t;
    }
    // 6.可以创建多泛型类型的方法，参泛型数可以不包含所申请的泛型
    public static <T,E,K> T print(List<T> list) {
        return list.get(new Random().nextInt(list.size()));
    }
    // 7.可以创建多泛型类型的方法，可以根据传入泛型处理逻辑
    public static <T,E,K> void print(T t,E e,K k) {
        System.out.println("---->t："+t +"  e:"+e+"  k:"+k);;
    }
    // 8.创建可变参数泛型方法
    public <T> void print(T... t) {
        for (int i = 0; i < t.length; i++) {
            System.out.println("---->t:"+t);
        }
    }
}
